import 'dart:typed_data';
import 'package:bluetooth_protocols_plugin/src/tools/utils.dart';
import 'package:bluetooth_protocols_plugin/src/base/enum.dart';
import 'package:flutter/material.dart';

// Lorin请求帧数据类
class LorinRequestBody {
  // 指令名称
  final String name;

  // 数据格式
  final LorinDataFormatType? dataFormat;

  // 源设备
  final int? source;

  // 目标设备
  final int? target;

  // 通道类型
  final LorinDataChannelType? channel;

  // 属性
  final LorinDataPropertyType? property;

  // 指令码
  final int? cmd;

  // 参数
  final Uint8List? param;

  // 是否是写指令
  final bool? isWrite;

  // 初始化
  LorinRequestBody(
    this.name, {
    this.dataFormat = LorinDataFormatType.norStcpp,
    this.source,
    this.target,
    this.channel,
    this.property,
    this.cmd,
    this.param,
    this.isWrite,
  }) {
    debugPrint('📡 >>>> $name');
  }

  // 源设备
  int get sourceDevice => source ?? 0x02;

  // 目标设备
  int get targetDevice => target ?? 0x21;

  // 是否需要Tab
  bool get needTab => true;

  // 是否需要加密
  bool get needCrypto => false;

  // 构建cmd
  Uint8List? get cmdList {
    switch (dataFormat) {
      case LorinDataFormatType.norCpp:
      case LorinDataFormatType.norTcpp:
      case LorinDataFormatType.norStcpp:
        return null;
      default:
        if (cmd == null) throw "cmd is null";

        return Utils.encodeCmd(
          cmd!,
          isRsp: false,
          // 不是所有带着参数param的指令都是写指令
          // 比如获取单次统计，携带参数起始编号和数目
          // 但它不是写指令
          // 所以这里需要额外传递一个isWrite参数
          // 优先级高于param，就算param不为空，但isWrite是false
          isWrite: isWrite == null ? (param != null) : isWrite!,
        );
    }
  }

  Map<String, dynamic> toMap() {
    return {
      'name': name,
      'dataFormat': dataFormat?.rawValue,
      'source': source,
      'target': target,
      'channel': channel?.rawValue,
      'property': property?.rawValue,
      'cmd': cmd,
      'param': param,
    };
  }
}
